#ifndef __RBTREE_H__
#define __RBTREE_H__

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>  // 新增：引入线程库
#include "nolock_list.h"
#include "public.h"
#include "aof_persist.h"

// 颜色定义
typedef enum { RED, BLACK } Color;


// 节点结构（键和值均为字符串）
typedef struct Node {
    char *key;             // 字符串键
    char *value;           // 字符串值
    Color color;           // 颜色
    struct Node *left;     // 左孩子
    struct Node *right;    // 右孩子
    struct Node *parent;   // 父节点
} Node;


// 红黑树结构（新增size记录节点总数，添加独有哨兵节点）
typedef struct RBTree{
    Node *root;            // 根节点
    int size;              // 节点总数（不含哨兵）
    Node *NIL_NODE;        // 每个树独有的哨兵节点（新增）
#if RB_TREE_MUTEX_LOCK
    pthread_mutex_t mutex_lock;  // 互斥锁（每个树实例独有）
#endif
#if RB_TREE_RW_LOCK
    pthread_rwlock_t rw_lock;    // 读写锁（每个树实例独有）
#endif
} RBTree;


void init_nil_node(RBTree *tree); // 修改：接收树实例
RBTree *rb_init();
int rb_insert(RBTree *tree, const char *key, const char *value);
Node *rb_search(RBTree *tree, const char *key);
int rb_update(RBTree *tree, const char *key, const char *new_value);
int rb_delete(RBTree *tree, const char *key);
int rb_get_size(RBTree *tree);
void rb_destroy(RBTree *tree); // 销毁整棵红黑树
int rb_clear(RBTree *tree); // 销毁红黑树的所有节点，当时红黑树仍保留
void inorder_traversal(RBTree *tree, Node *node); // 修改：接收树实例


// ================= 全量持久化 =================
int rb_full_store(RBTree *tree, const char *full_filename); // 全量持久化：将红黑树所有键值对写入文件
int rb_full_restore(const char *full_filename, RBTree* rbt); // 全量恢复：从文件加载键值对，重建红黑树
int rb_full_store_with_backup(RBTree *tree, const char *full_filename); // 备份当前的文件

#endif


